Modern software development techniques use modular design and data abstraction to increase a programmer's productivity by increased source code reuse. However, these techniques can also create additional performance problems such as those caused by incorrect estimation of the computational complexity of executable code. Computational complexity is an estimate of the total number of resources consumed by the code during execution. The resources can include timing resources, memory usage, number of files opened, number of threads created, etc.
Software performance testing attempts to address these issues by analyzing the computational complexity of the code using various test inputs. However, the code is generally tested using a small subset of inputs, which may not be sufficient to manifest the performance problems in the source code. Consequently, many performance problems show up very late in the software development process when it is hard to redesign the system to correct them.